package com.yeung.ssm.plugin;

import com.github.pagehelper.PageInterceptor;
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.reflection.MetaObject;
import org.apache.ibatis.reflection.SystemMetaObject;

import java.util.Properties;

/**
 * 插件的编写方法:
 * 1. 编写Interceptor的实现类
 * 2. 使用@Intercepts注解完成插件的签名
 * 3. 将写好的插件注册到全局配置文件中
 */


//告诉mybatis, 拦截的是哪个对象的哪个方法
@Intercepts(
        {
                @Signature(type = StatementHandler.class, method = "parameterize", args = java.sql.Statement.class)
        }
)
public class FirstPlugin implements Interceptor {
    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        System.out.println("first Plugin.. intercpet: " + invocation.getMethod());
        Object target = invocation.getTarget();
        System.out.println("当前拦截到的对象" + target);
        MetaObject metaObject = SystemMetaObject.forObject(target);
        Object value = metaObject.getValue("parameterHandler.parameterObject");
        System.out.println("sql 语句用的参数是" + value);
        //更改数据
        metaObject.setValue("parameterHandler.parameterObject", 3);
        invocation.proceed();//放行
        return invocation;
    }

    @Override
    public Object plugin(Object target) {
        //可以自己写代理对象的生成方式
        //也可使使用mybaitis提供的方法
        Object wrap = Plugin.wrap(target, this);
        //        返回为target创建的动态代理
        return wrap;
    }

    @Override
    public void setProperties(Properties properties) {
//将插件注册时的property属性设置进来
        System.out.println("插件的配置信息");
        System.out.println(properties);
    }
}
